package com.skiving.cloud.admin.service.impl;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.solon.service.impl.ServiceImpl;
import com.skiving.cloud.common.utils.PageParameter;
import com.skiving.cloud.admin.entity.SysOrg;
import com.skiving.cloud.admin.mapper.SysOrgMapper;
import com.skiving.cloud.admin.service.SysOrgService;
import org.noear.solon.annotation.Component;
import org.noear.solon.Utils;
import org.noear.solon.data.annotation.Cache;

import java.util.List;

/**
 * 组织机构表 服务层实现。
 *
 * @author skivingcloud
 * @since 2025-03-08
 */
@Component
public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg>  implements SysOrgService {
    /**
     * 分页查询组织机构表
     *
     * @param parameter 查询参数
     * @return 分页查询结果
     */
    @Override
    public Page<SysOrg> queryByPage(PageParameter<SysOrg> parameter){
        Page<SysOrg> page = new Page<>(parameter.getPage(), parameter.getPageSize());
        QueryWrapper queryWrapper = QueryWrapper.create();
        if (parameter.getParam() != null) {
            //查询条件
            if (Utils.isNotBlank(parameter.getParam().getId())) {
                queryWrapper.and(SysOrg::getId).like(parameter.getParam().getId());
            }
            if (Utils.isNotBlank(parameter.getParam().getOrgCode())) {
                queryWrapper.and(SysOrg::getOrgCode).like(parameter.getParam().getOrgCode());
            }
            if (Utils.isNotBlank(parameter.getParam().getOrgName())) {
                queryWrapper.and(SysOrg::getOrgName).like(parameter.getParam().getOrgName());
            }
            if (Utils.isNotBlank(parameter.getParam().getShortName())) {
                queryWrapper.and(SysOrg::getShortName).like(parameter.getParam().getShortName());
            }
            if (Utils.isNotBlank(parameter.getParam().getTenantId())) {
                queryWrapper.and(SysOrg::getTenantId).like(parameter.getParam().getTenantId());
            }
            if (Utils.isNotBlank(parameter.getParam().getParentId())) {
                queryWrapper.and(SysOrg::getParentId).like(parameter.getParam().getParentId());
            }
            if (Utils.isNotBlank(parameter.getParam().getOrgStatus())) {
                queryWrapper.and(SysOrg::getOrgStatus).like(parameter.getParam().getOrgStatus());
            }
            if (Utils.isNotBlank(parameter.getParam().getIsParent())) {
                queryWrapper.and(SysOrg::getIsParent).like(parameter.getParam().getIsParent());
            }
            if (Utils.isNotBlank(parameter.getParam().getOrgType())) {
                queryWrapper.and(SysOrg::getOrgType).like(parameter.getParam().getOrgType());
            }
            if (Utils.isNotBlank(parameter.getParam().getOrgRank())) {
                queryWrapper.and(SysOrg::getOrgRank).like(parameter.getParam().getOrgRank());
            }
            if (Utils.isNotBlank(parameter.getParam().getCreater())) {
                queryWrapper.and(SysOrg::getCreater).like(parameter.getParam().getCreater());
            }
            if (Utils.isNotBlank(parameter.getParam().getModUser())) {
                queryWrapper.and(SysOrg::getModUser).like(parameter.getParam().getModUser());
            }
        }
        return this.page(page, queryWrapper);
    }

    /**
     * 查询机构树形
     *
     * @return 查询机构树形
     */
    @Override
    @Cache(tags="skivingOrg", key="queryOrgTreeByAdmin")
    public List<SysOrg> getAllOrgTree() {
        List<SysOrg> list = this.mapper.selectAll();
        return list.stream().filter(item -> {
            item.setChildren(list.stream().filter(e -> e.getParentId().equals(item.getId())).toList());
            return item.getParentId().equals("0");
        }).toList();
    }

    /**
     * 查询机构树形
     *
     * @param tenantId 租户ID
     * @return 机构树形
     */
    @Override
    @Cache(tags="skivingOrg", key="${tenantId}_queryOrgTreeByTenantId")
    public List<SysOrg> getAllOrgTree(String tenantId) {
        QueryWrapper queryWrapper = QueryWrapper.create().where(SysOrg::getTenantId).eq(tenantId);
        List<SysOrg> list = this.mapper.selectListByQuery(queryWrapper);
        return list.stream().filter(item -> {
            item.setChildren(list.stream().filter(e -> e.getParentId().equals(item.getId())).toList());
            return item.getParentId().equals("0");
        }).toList();
    }
}
